/**
 * 防抖函数
 * @param {Function} fn 需要防抖的函数
 * @param {number} delay 延迟时间(毫秒)
 * @param {boolean} immediate 是否立即执行
 * @return {Function} 返回防抖处理后的函数
 */
export function debounce(fn, delay = 500, immediate = false) {
  let timer = null
  
  return function(...args) {
    const context = this
    
    // 清除已有的定时器
    if (timer) {
      clearTimeout(timer)
    }
    
    // 立即执行模式
    if (immediate) {
      // 如果timer为null，表示可以立即执行
      const callNow = !timer
      // 设置定时器，在delay时间后重置timer
      timer = setTimeout(() => {
        timer = null
      }, delay)
      
      if (callNow) {
        fn.apply(context, args)
      }
    } 
    // 非立即执行模式
    else {
      timer = setTimeout(() => {
        fn.apply(context, args)
      }, delay)
    }
  }
}